﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Seasar.Framework.Container.Factory;
using System.Web.SessionState;
using Shsc.Net.FrameWork.Common.Util;
using Shsc.Net.FrameWork.Common.SysException;
using System.Collections;

namespace Shsc.Net.FrameWork.Common.Session.Impl
{
    public class SessionWrapperImpl: ISessionWrapper
    {

        /// <summary>
        /// セッションのパラメタデータ用キー
        /// </summary>
        public static string SESSION_KEY_PARAM_INFO = "SESSION_KEY_PARAM_INFO";

        /// <summary>
        /// セッションのログイン情報用キー
        /// </summary>
        public static string SESSION_KEY_LOGIN_INFO = "SESSION_KEY_LOGIN_INFO";

        /// <summary>
        /// 
        /// </summary>
        public static string DEFAUL_WINDOW_NAME = "defaul_window_name";

        /// <summary>
        /// セッションオブジェクト
        /// </summary>
        private HttpSessionState session;

        /// <summary>
        /// 
        /// </summary>
        public SessionWrapperImpl()
        {
            session = SingletonS2ContainerFactory.Container.HttpContext.Session;
        }

        #region ISessionWrapper 成员

        /// <summary>
        /// セッションに情報保存データをセッションに保存する
        /// </summary>
        /// <param name="key"></param>
        /// <param name="obj"></param>
        public void Save(string key, object obj)
        {
            Save(DEFAUL_WINDOW_NAME, key, obj);
        }

        /// <summary>
        /// セッションに情報保存データをセッションに保存する
        /// </summary>
        /// <param name="wName"></param>
        /// <param name="key"></param>
        /// <param name="obj"></param>
        public void Save(string wName, string key, object obj)
        {
            if (StringUtil.IsEmpty(wName))
            {
                throw new InvalidParameterException();
            }

            Hashtable paramMap = (Hashtable)this.session[SESSION_KEY_PARAM_INFO];
            if (paramMap == null || paramMap.Count == 0)
            {
                paramMap = new Hashtable();
                session.Add(SESSION_KEY_PARAM_INFO, paramMap);
            }

            Hashtable windowMap = (Hashtable)paramMap[wName];
            if (windowMap == null || windowMap.Count == 0)
            {
                windowMap = new Hashtable();
                paramMap.Add(wName, windowMap);
            }
            windowMap.Add(key, obj);
        }

        /// <summary>
        /// /// セッションに情報取得セッションから予め保存された情報を取得する
        /// </summary>
        /// <param name="wName"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public object get(string wName, string key)
        {
            if (StringUtil.IsEmpty(wName) || StringUtil.IsEmpty(key))
            {
                throw new InvalidParameterException();
            }

            Hashtable paramMap = (Hashtable)this.session[SESSION_KEY_PARAM_INFO];
            if (paramMap == null || paramMap.Count == 0)
            {
                return null;
            }

            Hashtable windowMap = (Hashtable)paramMap[wName];
            if (windowMap == null || windowMap.Count == 0)
            {
                return null;
            }

            return windowMap[key];
        }

        /// <summary>
        /// セッションに情報取得セッションから予め保存された情報を取得する
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public object get(string key)
        {
            return get(DEFAUL_WINDOW_NAME, key);
        }

        /// <summary>
        /// セッションから情報削除セッションから情報を削除する
        /// </summary>
        /// <param name="wName"></param>
        /// <param name="key"></param>
        public void remove(string wName, string key)
        {
            if (StringUtil.IsEmpty(wName) || StringUtil.IsEmpty(key))
            {
                throw new InvalidParameterException();
            }

            Hashtable paramMap = (Hashtable)this.session[SESSION_KEY_PARAM_INFO];
            if (paramMap == null || paramMap.Count == 0)
            {
                return;
            }

            Hashtable windowMap = (Hashtable)paramMap[wName];
            if (windowMap == null || windowMap.Count == 0)
            {
                return;
            }

            windowMap.Remove(key);
        }

        /// <summary>
        /// セッションから情報削除セッションから情報を削除する
        /// </summary>
        /// <param name="wName"></param>
        public void remove(string wName)
        {
            if (StringUtil.IsEmpty(wName))
            {
                throw new InvalidParameterException();
            }

            Hashtable paramMap = (Hashtable)this.session[SESSION_KEY_PARAM_INFO];
            if (paramMap == null || paramMap.Count == 0)
            {
                return;
            }
            paramMap.Remove(wName);
        }

        /// <summary>
        /// パラメータデータマップとログイン情報クリアする
        /// </summary>
        public void ClearAll()
        {
            this.session.Clear();
        }

        #endregion
    }
}
